home *** CD-ROM | disk | FTP | other *** search
- /*
- showtext : shows text in "curses mode"
- Copyright (C) 1995 Rolf Jakob <rjakob@duffy1.franken.de>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
- #include <stdio.h>
- #include <ncurses/ncurses.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <string.h>
- #include <fcntl.h>
- #include <ctype.h>
- #include <time.h>
- #include <signal.h>
- #include "showdefs.h"
- #include "show.h"
-
- /*
- #define DEBUG 1
- */
-
- #ifdef DEBUG
- FILE *df;
- #endif
- int term=0;
- static int my_sig=0;
-
- WINDOW *w;
-
-
- extern char *getword();
-
- struct strbuffer_str {
- char buffername[16];
- char buffer[MAXSTRBUFFERLENGTH];
- } strb[MAXSTRBUFFER];
-
- char *strcpy_labelname(char *dest, char *src, char c)
- {
- char *d,*s;
-
- d=dest; s=src;
- while (*s) {
- if (*s=='$') {
- s++;
- switch(*s) {
- case 'g' :
- *d=c; break;
- }
- } else *d=*s;
- s++; d++;
- }
- *d=*s;
- return(dest);
- }
- /*-------------------------------------------------------------*/
-
- /* checks existance of a var
- returns -1 if not found else internal index
- */
- int checkvar(char *name)
- {
- int i=0,found=-1;
- char word[64];
-
- if (!*name) return(-1);
- strncpy(word,name,MAXNAMELENGTH);
- word[MAXNAMELENGTH-1]=0;
-
- for (i=0;i<MAXSTRBUFFER;i++)
- if (!strcmp(strb[i].buffername,word)) {
- found=i; break;
- }
- return(found);
- }
- /*-------------------------------------------------------------*/
-
- /* searches free space in var table
- returns -1 if no space else internal index
- */
- int emptyvar()
- {
- int i=0,found=-1;
-
- for (i=0;i<MAXSTRBUFFER;i++)
- if (!strb[i].buffername[0]) {
- found=i; break;
- }
- return(found);
- }
- /*-------------------------------------------------------------*/
-
- /* sets var to value
- returns -1 if not set else internal index
- */
- int setvar(char *name,char *buffer)
- {
- int i=0;
- char word[64];
-
- if (!*name) {
- #ifdef DEBUG
- fprintf(df,"no name for value %s\n",buffer);
- #endif
- return(-1);
- }
- strncpy(word,name,MAXNAMELENGTH);
- word[MAXNAMELENGTH-1]=0;
-
- i=checkvar(word);
- if(i<0) i=emptyvar();
- if(i<0) {
- #ifdef DEBUG
- fprintf(df,"no place for %s, value %s\n",word,buffer);
- #endif
- return(-1);
- } else strcpy(strb[i].buffername,word);
-
- strcpy(strb[i].buffer,buffer);
- #ifdef DEBUG
- fprintf(df,"set %s to %s\n",strb[i].buffername,buffer);
- #endif
- return(i);
- }
- /*-------------------------------------------------------------*/
-
- /* deletes var
- returns -1 if not set else internal index
- */
- int unsetvar(char *name)
- {
- int i=0;
- char word[64];
-
- if (!*name) return(-1);
- strncpy(word,name,MAXNAMELENGTH);
- word[MAXNAMELENGTH-1]=0;
-
- i=checkvar(word);
- if(i<0) return(-1);
-
- strb[i].buffername[0]=0;
- return(i);
- }
- /*-------------------------------------------------------------*/
-
- /* gets value of var
- returns pointer to buffer
- */
- char *getvar(char *name,char *buffer)
- {
- int i=0,rc;
- char word[64],help2[512];
- struct tm *t;
- time_t ti;
-
- #ifdef DEBUG
- fprintf(df,"getvar(%s)\n",name);
- #endif
- if (!*name) {
- *buffer=0;
- return(buffer);
- }
- strncpy(word,name,MAXNAMELENGTH);
- word[MAXNAMELENGTH-1]=0;
-
- if (!strcmp(word,"_hour")) {
- ti=time(NULL); t=localtime(&ti);
- sprintf(buffer,"%d",t->tm_hour);
- return(buffer);
- }
-
- if (!strcmp(word,"_min")) {
- ti=time(NULL); t=localtime(&ti);
- sprintf(buffer,"%d",t->tm_min);
- return(buffer);
- }
- if (!strcmp(word,"_time")) {
- sprintf(buffer,"%d",(int)time(NULL));
- return(buffer);
- }
-
- if (!strcmp(word,"_curx")) {
- sprintf(buffer,"%d",w->_curx); return(buffer); }
-
- if (!strcmp(word,"_maxx")) {
- sprintf(buffer,"%d",w->_maxx); return(buffer); }
-
- if (!strcmp(word,"_cury")) {
- sprintf(buffer,"%d",w->_cury); return(buffer); }
-
- if (!strcmp(word,"_maxy")) {
- sprintf(buffer,"%d",w->_maxy); return(buffer); }
-
- if (!strcmp(word,"_pid")) {
- sprintf(buffer,"%d",getpid()); return(buffer); }
-
- if (!strcmp(word,"_left")) {
- rc=atoi(getvar("_time",help2));
- rc-=atoi(getvar("_logon",help2));
- rc=atoi(getvar("_boxtime",help2))-rc/60;
- sprintf(buffer,"%d",rc);
- return(buffer);
- }
-
- i=checkvar(word);
- if(i<0)
- *buffer=0;
- else
- strcpy(buffer,strb[i].buffer);
-
- return(buffer);
- }
- /*-------------------------------------------------------------*/
-
- int gettoken(char *buffer,int len,char *option)
- {
- int ret=0,i;
- char htext[512],*p;
-
- strncpy(htext,buffer,len); *(htext+len)=0;
- p=htext;
- while(*p) {
- if (*p==' ') { *p++=0; break; }
- p++;
- }
- if (option) strcpy(option,p);
- i=0; while (c_tokens[i].number) {
- if (!strcmp(c_tokens[i].token,htext)) {
- ret=c_tokens[i].number; break;
- }
- i++;
- }
- #ifdef DEBUG
- fprintf(df,"\"%s\"(%s) ->%d\n",htext,option,ret);
- #endif
-
- return(ret);
- }
- /*-------------------------------------------------------------*/
-
- int file_exist(char *name)
- {
- int fd;
-
- fd=open(name,O_RDONLY);
- if (fd>0) {
- close(fd); return(1);
- } else return(0);
- }
- /*-------------------------------------------------------------*/
-
- int my_wgetnstr(WINDOW *wi,char *buffer,int max_length)
- {
- char *p;
- int c;
-
- p=buffer;
- if (!max_length)
- max_length=wi->_maxx-wi->_curx;
- if (max_length<0)
- max_length=wi->_maxx-wi->_curx+max_length;
- while (1) {
- c=wgetch(wi);
- if (c=='\n' || c=='\r') {
- *p=0; break; }
- if (c=='') {
- clearok(w,TRUE); wrefresh(w); continue; }
- if (c==KEY_BACKSPACE || c=='' || c=='\177') {
- if (p>buffer) {
- *p--=0; wi->_curx--; waddch(wi,' ');
- wi->_curx--; wrefresh(wi);
- continue;
- } else {
- beep(); wrefresh(wi);
- }
- continue;
- }
- if ((p-buffer)>=max_length) {
- beep(); wrefresh(wi); continue; }
- *p++=c;
- waddch(wi,c); wrefresh(wi);
- }
- *p=0;
- return(0);
- }
- /*-------------------------------------------------------------*/
-
- int u_outc(WINDOW *wi,FILE *f,int c)
- {
- int rc;
-
- if (term && f==stdout) rc=waddch(wi,c);
- else rc=putc(c,f);
- return(rc);
- }
- /*-------------------------------------------------------------*/
-
- int u_outs(WINDOW *wi,FILE *f,char *s)
- {
- int rc;
-
- if (term && f==stdout) rc=waddstr(wi,s);
- else rc=fprintf(f,"%s",s);
- return(rc);
- }
- /*-------------------------------------------------------------*/
-
- char *lit_expand(char *buffer)
- {
- char helpbuffer[8192],help2[512],word[512],*s,*d,*q;
- int rc;
- FILE *pd;
-
- s=buffer; d=helpbuffer;
- while(*s) {
- switch(*s) {
-
- case '$' :
- q=getword(s+1,word);
- if (*word) {
- s++;
- getvar(word,help2);
- strcpy(d,help2);
- d+=strlen(help2);
- if (q) s=q; else s+=strlen(word);
- } else s++;
- break;
-
- case '@' :
- s++;
- switch (*s) {
- case 't' :
- rc=atoi(getvar("_time",help2));
- rc-=atoi(getvar("_logon",help2));
- rc=atoi(getvar("_boxtime",help2))-rc/60;
- sprintf(help2,"%d",rc);
- strcpy(d,help2);
- d+=strlen(help2); s++;
- break;
- }
- break;
-
- case '`' :
- q=++s; while (*s!='`' && *s) s++;
- strncpy(help2,q,s-q);
- pd=popen(help2,"rt");
- if (pd) {
- while (1) {
- fgets(word,sizeof(word),pd);
- if (feof(pd)) break;
- strcpy(d,word);
- d+=strlen(word)-1;
- if (*d!='\n') d++;
- }
- pclose(pd);
- }
- s++;
- break;
-
- case '%' :
- q=getword(s+1,word);
- if (word) {
- s++;
- if (getenv(word))
- strcpy(help2,getenv(word));
- else *help2=0;
- strcpy(d,help2);
- d+=strlen(help2);
- if (q) s=q; else s+=strlen(word);
- } else s++;
- break;
-
- case '\\' :
- s++; *d++=*s++; break;
-
- default :
- *d++=*s++; break;
-
- }
- }
- *d=0;
- strcpy(buffer,helpbuffer);
- return(buffer);
- }
-
- void wputolm(WINDOW *wi,char *buffer)
- {
- int x,y;
- x=wi->_curx; y=wi->_cury;
- mvwaddstr(wi,0,0,buffer);
- wi->_curx=x; wi->_cury=y;
- wrefresh(wi);
- }
-
- void sig_USR1(void)
- { my_sig=SIGUSR1;
- /*
- printf("SIGUSR1"); fflush(stdout);
- signal(SIGUSR1,(void *)sig_USR1);
- */
- }
-
- void sig_USR2(void)
- { my_sig=SIGUSR2;
- signal(SIGUSR2,(void *)sig_USR2);
- }
-
- /*-------------------------------------------------------------*/
-
- void main(int argc, char* argv[])
- {
- FILE *fp,*pp;
- FILE *scr,*outf,*inpf;
- char filename[256],tmp[512],txt[512],options[512],*env,*p,*q;
- char inputfilename[512];
- char save_txt[MAXINCDEPTH][512],*save_p[MAXINCDEPTH];
- FILE *sf[MAXINCDEPTH];
- char word[512],command_token[512];
- int label_count,current_pos,re,i,j;
- char label_name[MAXLABELS][20];
- int label_pos[MAXLABELS];
- char label[512];
- int gc,dc,end_of_prg=0,bracket;
- int light,foreground,background,color;
- int hasc=0,never_in_term=1;
- int ilength;
- int pid;
- int ic;
- short fo,ba,found;
- int rc,cc,ccc,in_include;
- char pipebuffer[PIPEBUFFERSIZE],c;
- char tmpbuffer[INPUTBUFFERSIZE];
- char *cargv[32];
-
-
- #ifndef ST_VERSION
- #define ST_VERSION 0
- #endif
- #ifndef ST_SVERSION
- #define ST_SVERSION 0
- #endif
-
- while ((ic=getopt(argc,argv,"v?"))!=EOF) {
- switch(ic) {
- case 'v' :
- case '?' :
- printf("showtext V%d.%02d\n",ST_VERSION,ST_SVERSION);
- printf("Usage : %s [-v?] [file]\n",argv[0]);
- exit(0); break;
- }
- }
-
- if (optind>=argc) exit(0);
- strcpy(inputfilename,argv[optind++]);
-
- for (rc=0;rc<MAXSTRBUFFER;rc++) {
- strb[rc].buffername[0]=0;
- strb[rc].buffer[0]=0;
- }
- strcpy(strb[0].buffername,"_error");
- strcpy(strb[1].buffername,"_term");
- strcpy(strb[2].buffername,"_level");
- strcpy(strb[3].buffername,"_logon");
- strcpy(strb[4].buffername,"_time");
- strcpy(strb[5].buffername,"_boxtime");
- strcpy(strb[6].buffername,"_left");
-
- if (getenv("TERM")) strcpy(strb[1].buffer,getenv("TERM"));
- else strcpy(strb[1].buffer,"dumb");
- if (getenv("boxlevel")) strcpy(strb[2].buffer,getenv("boxlevel"));
- else strcpy(strb[2].buffer,"10");
- if (getenv("logon_time")) strcpy(strb[3].buffer,getenv("logon_time"));
- else sprintf(strb[3].buffer,"%d",(int)time(NULL));
- sprintf(strb[4].buffer,"%d",(int)time(NULL));
- if (getenv("boxtime")) strcpy(strb[5].buffer,getenv("boxtime"));
- else strcpy(strb[5].buffer,"10");
-
- *label=0; *pipebuffer=0; gc=0;
- ccc=1; cc=1; scr=stdout; outf=stdout; inpf=NULL;
- in_include=0; save_p[0]=NULL; sf[0]=NULL;
-
- foreground=COLOR_WHITE; background=COLOR_BLACK;
- light=0; color=0; label_count=0; current_pos=0;
-
- #ifdef DEBUG
- sprintf(filename,"/tmp/err.%d",getpid());
- df=fopen(filename,"wt");
- #endif
-
- w=NULL;
- if ((getenv("SHOWPATH"))==NULL)
- strcpy(tmpbuffer,"/usr/lib/box");
- else
- strcpy(tmpbuffer,getenv("SHOWPATH"));
- q=tmpbuffer+strlen(tmpbuffer)-1;
- if (*q=='/') *q=0;
- sprintf(filename,"%s/%s",tmpbuffer,inputfilename);
-
- signal(SIGUSR1,(void *)sig_USR1);
- signal(SIGUSR2,(void *)sig_USR2);
-
- fp=fopen(filename,"rt");
- if (!fp) {
- sprintf(filename,"%s",inputfilename);
- fp=fopen(filename,"rt");
- }
- if (fp) {
-
- /* scan labels */
-
- while(1) {
- fgets(txt,sizeof(txt),fp);
- if (feof(fp)) break;
- if (*txt=='#') {
- current_pos+=strlen(txt);
- continue;
- }
- re=strlen(txt);
-
- p=txt;
- while (*p) {
- if (*p=='[') {
- q=++p; bracket=1;
- while(1) {
- if (*p==']') bracket--;
- if (*p=='[') bracket++;
- if (!bracket) break;
- p++;
- }
- if (*q=='/') {
- strncpy(label,q,p-q);
- *(label+(p-q))=0;
- strcpy(label_name[label_count],label+1);
- label_pos[label_count]=current_pos+(p-txt)+1;
- #ifdef DEBUG
- fprintf(df,"found label <%s> at %d (cp=%d)\n",
- label_name[label_count],label_pos[label_count],
- current_pos);
- #endif
- label_count++;
- *label=0;
- }
- }
- p++;
- }
- current_pos+=re;
- }
-
- rewind(fp); current_pos=0;
-
- /* scan tokens */
-
- while(1) {
- fgets(txt,sizeof(txt),fp);
- if (feof(fp)) break;
- if (*txt=='#') {
- current_pos+=strlen(txt);
- continue;
- }
- re=strlen(txt);
- if (strlen(txt)>1) {
- p=txt+strlen(txt)-2;
- if (*p=='\\') *p=0;
- }
-
- p=txt;
- while (*p) {
- if (*p=='\\') {
- p++;
- switch(*p) {
- case 'a' : dc='\a'; break;
- case 'b' : dc='\b'; break;
- case 'f' : dc='\f'; break;
- case 'n' : dc='\n'; break;
- case 'r' : dc='\r'; break;
- case 't' : dc='\t'; break;
- case 'v' : dc='\v'; break;
- default : dc=*p; break;
- }
- } else
- if (*p=='[') {
- q=++p; bracket=1;
- while(1) {
- if (*p==']') bracket--;
- if (*p=='[') bracket++;
- if (!bracket) break;
- p++;
- }
- if (*q=='/') {
- p++;
- continue;
- }
- memmove(command_token,q,p-q);
- command_token[p-q]=0;
- dc=gettoken(q,p-q,options);
-
- if (dc>=C_FIRSTCOLOR && dc<=C_LASTCOLOR) {
- if (term && hasc) {
- foreground=dc-C_FIRSTCOLOR; light=0;
- if (foreground>7) {foreground&=7; light=1;}
- found=0;
- for (i=1;i<cc;i++) {
- pair_content(i,&fo,&ba);
- if (fo==foreground && ba==background) {
- found=1; ccc=i; break; }
- }
- if (!found) {
- ccc=cc++;
- init_pair(ccc,foreground,background);
- }
- color=COLOR_PAIR(ccc);
- wrefresh(w);
- rc=wattron(w,color|(light?A_BOLD:0));
- if (!light) wattroff(w,A_BOLD);
- }
- } else
-
- if (dc==C_BACKGROUND) {
- dc=gettoken(options,strlen(options),NULL);
- if (dc>=C_FIRSTCOLOR && dc<=C_LASTCOLOR) {
- if (term && hasc) {
- background=(dc-C_FIRSTCOLOR)&7;
- found=0;
- for (i=1;i<cc;i++) {
- pair_content(i,&fo,&ba);
- if (fo==foreground && ba==background) {
- found=1; ccc=i; break; }
- }
- if (!found) {
- ccc=cc++;
- init_pair(cc,foreground,background);
- }
- color=COLOR_PAIR(cc);
- rc=wattron(w,color|(light?A_BOLD:0));
- cc++;
- }
- }
- } else
-
- switch(dc) {
-
- case 0 :
- q=getword(command_token,word);
- rc=checkvar(word);
- if (rc==-1) {
- #ifdef DEBUG
- fprintf(df,"unknown token : <%s>\n",
- word);
- #endif
- break;
- }
- getvar(word,tmpbuffer);
- rc=strlen(tmpbuffer);
- #ifdef DEBUG
- fprintf(df,"found macro <%s> : <%s>\n",
- word,tmpbuffer);
- #endif
- if (rc) {
- memmove(p+rc+1,p+1,strlen(p));
- memmove(p+1,tmpbuffer,strlen(tmpbuffer));
- }
- break;
-
- case C_CLS :
- if (term) wclear(w); break;
-
- case C_TERM :
- if (!term) {
- if (never_in_term) {
- w=initscr();
- cbreak();
- noecho();
- keypad(w,TRUE);
- leaveok(w,FALSE);
- never_in_term=0;
- hasc=has_colors();
- if (hasc) start_color();
- #ifdef DEBUG
- fprintf(df,"has_colors=%d\n",hasc);
- #endif
- } else {
- clearok(stdscr,TRUE);
- fixterm(); wrefresh(w);
- }
- term=1;
- }
- break;
-
- case C_REFRESH :
- if (term) wrefresh(w); break;
-
- case C_GO_X :
- if (term) {
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- i=atoi(tmpbuffer);
- if (i>=0 && i<=w->_maxx)
- w->_curx=i;
- }
- break;
-
- case C_GO_Y :
- if (term) {
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- i=atoi(tmpbuffer);
- if (i>=0 && i<=w->_maxy)
- w->_cury=i;
- }
- break;
-
- case C_C_EOL :
- if (term) wclrtoeol(w); break;
-
- case C_C_BOT :
- if (term) wclrtobot(w); break;
-
- case C_GOTO :
- if (*options)
- if (*options!='/') {
- strcpy_labelname(label,options,gc);
- }
- i=-1;
- for (j=0;j<label_count;j++) {
- if (!strcmp(label_name[j],label)) {
- i=label_pos[j]; break;
- }
- }
- if (i>=0) {
- fseek(fp,i,SEEK_SET);
- current_pos=i;
- *label=0; *p=0;
- continue;
- }
- #ifdef DEBUG
- fprintf(df,"label \"%s\" not found!\n",label);
- #endif
- break;
-
- case C_GETKEY :
- if (*options) {
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- } else *tmpbuffer=0;
- if (term) {
- wrefresh(w);
- while(1) {
- gc=wgetch(w);
- if (gc==ERR || gc==EINTR) break;
- if (*tmpbuffer) {
- if (!strchr(tmpbuffer,gc)) {
- if (gc=='') clearok(w,TRUE);
- beep(); wrefresh(w); }
- else break;
- } else break;
- }
- /*
- if (my_sig) {
- wputolm(w,"laber"); my_sig=0;}
- */
-
- } else {
- gc=getchar();
- if (*tmpbuffer)
- while (!strchr(tmpbuffer,gc))
- gc=getchar();
- }
- *tmpbuffer=gc; *(tmpbuffer+1)=0;
- setvar("_Key",tmpbuffer);
- *tmpbuffer=tolower(*tmpbuffer);
- setvar("_key",tmpbuffer);
- break;
-
- case C_GETSTR :
- q=getword(options,word);
- ilength=atoi(word);
- if (q) strcpy(word,q);
- else *word=0;
- if (term) {
- wrefresh(w);
- my_wgetnstr(w,tmpbuffer,ilength);
- } else fgets(tmpbuffer,sizeof(tmpbuffer),stdin);
- q=tmpbuffer+strlen(tmpbuffer)-1;
- if (*q=='\n') *q=0;
- setvar(word,tmpbuffer);
- break;
-
- case C_PAUSE :
- if (!*options || !term) break;
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- rc=atoi(tmpbuffer);
- if ((w->_maxy-w->_cury)>rc) break;
- *tmpbuffer=0;
-
- case C_WAIT :
- if (dc==C_WAIT)
- strcpy(tmpbuffer,options);
- if (!*tmpbuffer) getvar("_wait",tmpbuffer);
- if (!*tmpbuffer) strcpy(tmpbuffer,"more ");
- lit_expand(tmpbuffer);
-
- if (term) {
- u_outs(w,scr,tmpbuffer);
- wrefresh(w);
- c=0; /* wtimeout(w,1000); */
- while (c!=13 && c!=10) {
- #ifndef USE_OWN_GETC
- c=wgetch(w);
- #ifdef DEBUG
- fprintf(df,"nach wgetch(w):%d\n",my_sig);
- fflush(df);
- #endif
- #else
- c=getchar();
- #ifdef DEBUG
- fprintf(df,"nach getchar():%d\n",my_sig);
- fflush(df);
- #endif
- #endif
- if (my_sig) {
- wputolm(w,"bla");
- wrefresh(w); my_sig=0;
- #ifdef DEBUG
- fprintf(df,"refreshed\n");
- #endif
- }
- }
- if (dc==C_PAUSE) wclear(w);
- } else {
- printf(tmpbuffer);
- c=getchar();
- }
- break;
-
- case C_NORMAL :
- if (term) {
- foreground=COLOR_WHITE; background=COLOR_BLACK;
- light=0;
- wattrset(w,A_NORMAL);
- }
- break;
-
- case C_NOBOLD :
- if (term)
- wattroff(w,A_BOLD);
- break;
-
- case C_BOLD :
- if (term)
- wattron(w,A_BOLD);
- break;
-
- case C_NOBLINK :
- if (term)
- wattroff(w,A_BLINK);
- break;
-
- case C_BLINK :
- if (term)
- wattron(w,A_BLINK);
- break;
-
- case C_INVERS :
- if (term) {
- wattron(w,A_REVERSE);
- }
- break;
-
- case C_NOINVERS :
- if (term) {
- wattroff(w,A_REVERSE);
- }
- break;
-
- case C_ENV :
- env=getenv(options);
- if (env)
- u_outs(w,scr,env);
- setvar("_error",env?"":"1");
- break;
-
- case C_LOGIN :
- strcpy(tmp,getenv("LOGNAME"));
- u_outs(w,scr,tmp);
- break;
-
- case C_NOTERM :
- if (term) {
- refresh();
- saveterm(); resetterm();
- term=0;
- }
- break;
-
- case C_SYSTEM :
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- rc=system(tmpbuffer);
- *tmpbuffer=0;
- if (rc) sprintf(tmpbuffer,"%d",errno);
- setvar("_error",tmpbuffer);
- break;
-
- case C_SPAWN :
- case C_EXEC :
- i=0;
- strcpy(tmp,options);
- lit_expand(tmp);
- q=getword(tmp,word);
- strcpy(tmpbuffer,word);
- cargv[0]=tmpbuffer; cargv[1]=NULL;
- while(q) {
- i++;
- cargv[i]=cargv[i-1]+strlen(cargv[i-1])+1;
- q=getword(q,word);
- if (word) strcpy(cargv[i],word);
- cargv[i+1]=NULL;
- }
- #ifdef DEBUG
- i=0; while(cargv[i]) {
- fprintf(df,"%d:%s\n",i,cargv[i]);
- i++; }
- #endif
- if (dc==C_SPAWN)
- if ((pid=fork()))
- break;
- #ifdef DEBUG
- if (df) fclose(df);
- #endif
- execvp(cargv[0],cargv);
- perror("exec");
- sprintf(tmpbuffer,"%d",errno);
- setvar("_error",tmpbuffer);
- break;
-
- case C_PIPE :
- case C_PPIPE :
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- pp=popen(tmpbuffer,"r");
- if (pp) {
- env=pipebuffer;
- while(1) {
- fgets(env,PIPEBUFFERSIZE-(env-pipebuffer-1),pp);
- if (feof(pp)) break;
- while (*env) env++;
- if ((PIPEBUFFERSIZE-(env-pipebuffer-1))<1)
- break;
- }
- pclose(pp);
- env=pipebuffer+strlen(pipebuffer)-1;
- if (*env=='\n') *env=0;
- if (dc==C_PPIPE)
- u_outs(w,scr,pipebuffer);
- *tmpbuffer=0;
- } else sprintf(tmpbuffer,"%d",errno);
- setvar("_error",tmpbuffer);
- break;
-
- case C_SET :
- if (!*options) break;
- q=getword(options,word);
- *tmpbuffer=0;
- if (q) strcpy(tmpbuffer,q);
- lit_expand(tmpbuffer);
- setvar(word,tmpbuffer);
- break;
-
- case C_UNSET :
- if (!*options) break;
- unsetvar(options);
- break;
-
- case C_OSTR :
- u_outs(w,scr,getvar(options,tmpbuffer));
- break;
-
- case C_OSTRI :
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- u_outs(w,scr,tmpbuffer);
- break;
-
- case C_OKEY :
- u_outc(w,scr,gc);
- break;
-
- case C_OSTRC :
- getvar(options,tmpbuffer);
- if (term)
- w->_curx=(w->_maxx-strlen(tmpbuffer))/2;
- u_outs(w,scr,getvar(options,tmpbuffer));
- break;
-
- case C_TRUNCR :
- getvar(options,tmpbuffer);
- q=tmpbuffer+strlen(tmpbuffer)-1;
- while(q>=tmpbuffer && *q==' ') *(q--)=0;
- setvar(options,tmpbuffer);
- break;
-
- case C_TRUNCL :
- getvar(options,tmpbuffer);
- q=tmpbuffer;
- while(*q && *q==' ') q++;
- setvar(options,q);
- break;
-
- case C_IFZERO :
- case C_IFNZERO :
- rc=atoi(getvar(options,tmpbuffer));
- if (dc==C_IFZERO && rc) *(p+1)=0;
- if (dc==C_IFNZERO && !rc) *(p+1)=0;
- break;
-
- case C_ADVANCE :
- q=getword(options,word);
- if (!q) break;
- strcpy(tmp,q); lit_expand(tmp);
- rc=atoi(getvar(word,tmpbuffer));
- rc+=atoi(tmp);
- sprintf(tmpbuffer,"%d",rc);
- setvar(word,tmpbuffer);
- break;
-
- case C_IFGT :
- case C_IFNGT :
- q=getword(options,word);
- if (!q) { *(p+1)=0; break; }
- strcpy(tmp,q); lit_expand(tmp);
- rc=atoi(getvar(word,tmpbuffer));
- if (dc==C_IFGT && rc<=atoi(tmp)) *(p+1)=0;
- if (dc==C_IFNGT && rc>atoi(tmp)) *(p+1)=0;
- break;
-
- case C_IFEQ :
- case C_IFNEQ :
- q=getword(options,word);
- if (!q) { *(p+1)=0; break; }
- getvar(word,tmpbuffer);
- strcpy(tmp,q); lit_expand(tmp);
- rc=strcmp(tmpbuffer,tmp);
- if (dc==C_IFEQ && rc) *(p+1)=0;
- if (dc==C_IFNEQ && !rc) *(p+1)=0;
- break;
-
- case C_IFEMPTY :
- case C_IFNEMPTY :
- getvar(options,tmpbuffer);
- if (dc==C_IFEMPTY && *tmpbuffer) *(p+1)=0;
- if (dc==C_IFNEMPTY && !*tmpbuffer) *(p+1)=0;
- break;
-
- case C_OPIPE :
- u_outs(w,scr,pipebuffer); break;
-
- case C_OPEN :
- if (*options) {
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- outf=fopen(tmpbuffer,"wt");
- if(outf) *tmpbuffer=0;
- else sprintf(tmpbuffer,"%d",errno);
- setvar("_error",tmpbuffer);
- }
- break;
-
- case C_APPEND :
- if (*options) {
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- outf=fopen(tmpbuffer,"at");
- sprintf(tmpbuffer,"%d",errno);
- setvar("_error",tmpbuffer);
- }
- break;
-
- case C_IOPEN :
- if (*options) {
- if (inpf) fclose(inpf);
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- #ifdef DEBUG
- fprintf(df,"iopen \"%s\"",tmpbuffer);
- #endif
- inpf=fopen(tmpbuffer,"rt");
- if (!inpf) {
- sprintf(tmpbuffer,"%d",errno);
- #ifdef DEBUG
- fprintf(df," %s\n",strerror(errno));
- #endif
- } else {
- #ifdef DEBUG
- fprintf(df," opened\n");
- #endif
- *tmpbuffer=0;
- }
- setvar("_error",tmpbuffer);
- }
- break;
-
- case C_IGETSTR :
- if (inpf) {
- fgets(tmpbuffer,sizeof(tmpbuffer),inpf);
- setvar("_error","");
- if (feof(inpf)) {
- *tmpbuffer=0;
- setvar("_error","1");
- }
- q=tmpbuffer+strlen(tmpbuffer)-1;
- if (*q=='\n') *q=0;
- } else setvar("_errno","2");
- setvar(options,tmpbuffer);
- break;
-
- case C_IFTERM :
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- if (strcmp(getenv("TERM"),tmpbuffer))
- *(p+1)=0;
- break;
-
- case C_IFEX :
- #ifdef DEBUG
- fprintf(df,"file_check(%s)\n",options);
- #endif
- strcpy(tmpbuffer,options);
- lit_expand(tmpbuffer);
- if (!file_exist(tmpbuffer))
- *(p+1)=0;
- break;
-
- case C_REDIR :
- if (outf) scr=outf;
- break;
-
- case C_UNREDIR :
- scr=stdout;
- break;
-
- case C_EXIT :
- if (in_include) {
- fclose(fp); in_include--;
- strcpy(txt,save_txt[in_include]);
- p=save_p[in_include];
- fp=sf[in_include];
- break; }
- end_of_prg=1;
- break;
-
- case C_INCLUDE :
- if (in_include>=MAXINCDEPTH) break;
- sf[in_include]=fp; fp=fopen(options,"rt");
- #ifdef DEBUG
- fprintf(df,"including %s\n",options);
- #endif
- if (!fp) {
- #ifdef DEBUG
- fprintf(df,"include %s:%s\n",options,
- strerror(errno));
- #endif
- fp=sf[in_include]; break; }
- save_p[in_include]=p;
- strcpy(save_txt[in_include],txt);
- p=txt; *(p+1)=0; in_include++;
- break;
-
- case C_CLOSE :
- if (!outf) {
- scr=stdout;
- fclose(outf);
- outf=NULL;
- }
- break;
-
- case C_IREWIND :
- if (inpf) {
- fseek(inpf,0L,SEEK_SET);
- }
- break;
-
- case C_ICLOSE :
- if (inpf) {
- fclose(inpf);
- inpf=NULL;
- }
- break;
-
- }
- dc=0;
- } else {
- dc=*p;
- }
- if (end_of_prg) break;
- p++;
- if (dc) {
- rc=u_outc(w,scr,dc);
- }
- }
- /* end of former func show() */
-
- if (end_of_prg) break;
- current_pos+=re;
- }
- fclose(fp);
- } else {
- perror(filename);
- }
- if (term) endwin();
- }
-